package com.atguigu.lease.web.admin.controller.apartment;


import com.atguigu.lease.common.result.Result;
import com.atguigu.lease.model.entity.LabelInfo;
import com.atguigu.lease.model.enums.ItemType;
import com.atguigu.lease.web.admin.service.LabelInfoService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "标签管理")
@RestController
@RequestMapping("/admin/label")
public class LabelController {

    @Autowired
    private LabelInfoService labelInfoService;

    /**
     * 1.接收用户提交的查询信息
     * 2.url地址?type=1  查询公寓标签信息
     *   url地址?type=2  查询房间标签信息
     *   url地址         查询的所有的标签信息 包括公寓和房间
     *
     * 问题:
     *    参数:  type=1
     *    接收参数:  ItemType枚举类型
     *    需要为枚举类型ItemType.code 完成赋值.  但是springmvc不能直接转换 400报错
     * 解决方案:
     *      使用转换器: 接收指定的数据  返回特定的结果.  Converter
     * 实现思路:
     *         url?type=1    -----> Converter ----------> ItemType.APARTMENT
     *         url?type=2    -----> Converter ----------> ItemType.ROOM
     *
     *
     * 难点2:
     *      mybatisplus进行单表CURD操作时 一般属性与字段一致.
     * 问题:
     *       private ItemType type; 该属性是枚举类型
     * 解决方案:
     *       如果在mp中如果使用枚举类型实现参数传递 则使用注解@EnumValue
     *       传递的参数 变成 该注解标记的属性.
     *
     * 没有注解时:
     *      SELECT id,type,name,create_time,update_time,is_deleted FROM label_info WHERE is_deleted=0 AND (type = ?)
     * ==> Parameters: ROOM(String)
     *
     * 有注解时:
     *      SELECT id,type,name,create_time,update_time,is_deleted FROM label_info WHERE is_deleted=0 AND (type = ?)
     * ==> Parameters: 2(Integer)
     *
     *
     *  问题3:
     *       如果使用LabelInfo对象返回数据 则默认采用GetXXX方法获取属性和属性值.
     *       {
     *           .....
     *           type:  ROOM
     *           应该获取的是枚举类型的值
     *          type:  1/2
     *       }
     *
     */
    @Operation(summary = "（根据类型）查询标签列表")
    @GetMapping("list")
    public Result<List<LabelInfo>> labelList(@RequestParam(required = false) ItemType type) {

        //1.如果type 有值 则根据code进行查询
        QueryWrapper<LabelInfo> queryWrapper = new QueryWrapper<>();
        //2.根据枚举是否为null 动态查询数据
        queryWrapper.eq(type !=null,"type",type);
        List<LabelInfo> list =  labelInfoService.list(queryWrapper);
        return Result.ok(list);
    }

    @Operation(summary = "新增或修改标签信息")
    @PostMapping("saveOrUpdate")
    public Result saveOrUpdateLabel(@RequestBody LabelInfo labelInfo) {

        labelInfoService.saveOrUpdate(labelInfo);
        return Result.ok();
    }

    @Operation(summary = "根据id删除标签信息")
    @DeleteMapping("deleteById")
    public Result deleteLabelById(@RequestParam Long id) {

        labelInfoService.removeById(id);
        return Result.ok();
    }
}
